/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import model.dto.EspecieDTO;

/**
 *
 * @author Gabriel Menezes
 */
public class EspecieDAO extends DAO {

    private static String SELECT_ESPECIE =
            ""; //TODO: Exportar o select de negócio da Espécie para cá usando o PL Developer

    public EspecieDAO() throws SQLException, ClassNotFoundException {
        super();
    }

    private EspecieDTO getEspecieResultSet(ResultSet rs) throws SQLException {
        EspecieDTO especieDTO = new EspecieDTO();
        especieDTO.setId(rs.getInt("Id"));
        especieDTO.setNomeCientifico(rs.getString("Nome_Cientifico"));
        especieDTO.setProcedencia(rs.getInt("Id_Procedencia"), rs.getString("Descricao_Procedencia"));
        especieDTO.setNomeVulgar(rs.getString("Nome_Vulgar"));
        especieDTO.setFamilia(rs.getString("Família"));
        especieDTO.setGrpEcoGeral(rs.getInt("Id_Grp_Eco_Geral"), rs.getString("Descricao_Grp_Eco_Geral"));
        especieDTO.setGrpEcoEspec(rs.getInt("Id_Grp_Eco_Espec"), rs.getString("Descricao_Grp_Eco_Espec"));
        especieDTO.setDiamMinCopa(rs.getDouble("Diam_min_copa"));
        especieDTO.setDiamMaxCopa(rs.getDouble("Diam_max_copa"));
        especieDTO.setFusteMin(rs.getDouble("Fuste_min"));
        especieDTO.setFusteMax(rs.getDouble("Fuste_max"));
        especieDTO.setAlturaMin(rs.getDouble("Altura_min"));
        especieDTO.setAlturaMax(rs.getDouble("Altura_max"));
        especieDTO.setDesenvolvimento(rs.getInt("Id_Desenvolvimento"), rs.getString("Descricao_Desenvolvimento"));
        especieDTO.setCicloProducao(rs.getInt("Ciclo_Producao"));
        especieDTO.setfLCor(rs.getString("FL_cor"));
        especieDTO.setfLMes(rs.getString("FL_mes"));
        especieDTO.setTipoFruto(rs.getInt("Id_Tipo_Fruto"), rs.getString("Descricao_Tipo_Fruto"));
        especieDTO.setNatureza(rs.getInt("Id_Natureza"), rs.getString("Descricao_Natureza"));
        especieDTO.setfRCor(rs.getString("FR_cor"));
        especieDTO.setfRMes(rs.getString("FR_mes"));
        especieDTO.setTipoSemeadura(rs.getInt("Id_Tipo_Semeadura"), rs.getString("Descricao_Tipo_Semeadura"));
        especieDTO.setSementesKG(rs.getDouble("Sementes_KG"));
        especieDTO.setArmazenSemente(rs.getInt("Id_Armazen_Semente"), rs.getString("Descricao_Armazen_Semente"));
        especieDTO.setTmpGerminMin(rs.getInt("Tmp_Germin_min"));
        especieDTO.setTmpGerminMax(rs.getInt("Tmp_Germin_max"));
        especieDTO.setPercentGermin(rs.getDouble("Percent_Germin"));
        especieDTO.setViabilSemente(rs.getInt("Viabil_Semente"));
        return especieDTO;
    }

    private LinkedList<EspecieDTO> getEspeciesResultSet(ResultSet rs) throws SQLException {
        LinkedList<EspecieDTO> especieDTOs = new LinkedList<EspecieDTO>();
        while (rs.next()) {
            especieDTOs.add(getEspecieResultSet(rs));
        }
        return especieDTOs;
    }

    public LinkedList<EspecieDTO> pesquisaEspecie(Integer id, String nomeEspecie) throws SQLException {
        sql = SELECT_ESPECIE;
        if (id != null) {
            sql += "  AND Id = " + id + "\n";
        }
        if (nomeEspecie != null) {
            sql += " AND (e.nome_cientifico like '%" + nomeEspecie + "%' OR e.nome_vulgar like '%" + nomeEspecie + "%')\n";
        }
        sql += ";";
        resultSet = connector.executeSelectQuery(sql);
        return getEspeciesResultSet(resultSet);
    }

    public void insereEspecie(EspecieDTO especieDTO) throws SQLException {
        sql += "insert into Especie(Altura_max,\n"
                + "                 Altura_min,\n"
                + "                 Armazen_Semente,\n"
                + "                 Ciclo_Producao,\n"
                + "                 Desenvolvimento,\n"
                + "                 Diam_max_copa,\n"
                + "                 Diam_min_copa,\n"
                + "                 Familia,\n"
                + "	            FL_cor,\n"
                + "                 FL_mes,\n"
                + "                 FR_cor,\n"
                + "                 FR_mes,\n"
                + "		    Fuste_max,\n"
                + "                 Fuste_min,\n"
                + "                 Grp_Eco_Espec,\n"
                + "                 Grp_Eco_Geral,\n"
                + "		    Id,\n"
                + "                 Natureza,\n"
                + "                 Nome_Cientifico,\n"
                + "                 Nome_Vulgar,\n"
                + "                 Percent_Germin,\n"
                + "                 Procedencia,\n"
                + "                 Sementes_KG,\n"
                + "                 Tipo_Fruto,\n"
                + "                 Tipo_Semeadura,\n"
                + "                 Tmp_Germin_max,\n"
                + "		    Tmp_Germin_min,"
                + "                 Viabil_Semente)\n"
                + "values (" + especieDTO.getAlturaMax() + ",\n"
                + "        " + especieDTO.getAlturaMin() + ",\n"
                + "        " + especieDTO.getIdArmazenSemente() + ",\n"
                + "	   " + especieDTO.getCicloProducao() + ",\n"
                + "	   " + especieDTO.getIdDesenvolvimento() + ",\n"
                + "	   " + especieDTO.getDiamMaxCopa() + ",\n"
                + "	   " + especieDTO.getDiamMinCopa() + ",\n"
                + "	   " + especieDTO.getFamilia() + ",\n"
                + "	   " + especieDTO.getfLCor() + ",\n"
                + "	   " + especieDTO.getfLMes() + ",\n"
                + "	   " + especieDTO.getfRCor() + ",\n"
                + "	   " + especieDTO.getfRMes() + ",\n"
                + "	   " + especieDTO.getFusteMax() + ",\n"
                + "	   " + especieDTO.getFusteMin() + ",\n"
                + "	   " + especieDTO.getIdGrpEcoEspec() + ",\n"
                + "	   " + especieDTO.getIdGrpEcoGeral() + ",\n"
                + "	   " + especieDTO.getId() + ",\n"
                + "	   " + especieDTO.getIdNatureza() + ",\n"
                + "	   " + especieDTO.getNomeCientifico() + ",\n"
                + "	   " + especieDTO.getNomeVulgar() + ",\n"
                + "	   " + especieDTO.getPercentGermin() + ",\n"
                + "	   " + especieDTO.getIdProcedencia() + ",\n"
                + "	   " + especieDTO.getSementesKG() + ",\n"
                + "	   " + especieDTO.getIdTipoFruto() + ",\n"
                + "	   " + especieDTO.getIdTipoSemeadura() + ",\n"
                + "	   " + especieDTO.getTmpGerminMax() + ",\n"
                + "	   " + especieDTO.getTmpGerminMin() + ",\n"
                + "	   " + especieDTO.getViabilSemente() + ");";

        connector.executeInsertQuery(sql);
    }

    public void atualizaEspecie(EspecieDTO especieDTO,
            Boolean atualizaNomecientifico,
            Boolean atualizaProcedencia,
            Boolean atualizaNomevulgar,
            Boolean atualizaFamilia,
            Boolean atualizaGrpecogeral,
            Boolean atualizaGrpecoespec,
            Boolean atualizaDiammincopa,
            Boolean atualizaDiammaxcopa,
            Boolean atualizaFustemin,
            Boolean atualizaFustemax,
            Boolean atualizaAlturamin,
            Boolean atualizaAlturamax,
            Boolean atualizaDesenvolvimento,
            Boolean atualizaCicloproducao,
            Boolean atualizaFlcor,
            Boolean atualizaFlmes,
            Boolean atualizaTipofruto,
            Boolean atualizaNatureza,
            Boolean atualizaFrCor,
            Boolean atualizaFrMes,
            Boolean atualizaTiposemeadura,
            Boolean atualizaSementeskg,
            Boolean atualizaArmazenSemente,
            Boolean atualizaTmpGerminMin,
            Boolean atualizaTmpGerminMax,
            Boolean atualizaPercentGermin,
            Boolean atualizaViabilSemente) throws SQLException {

        /* O booleano abaixo informa se a instrução SQL ainda não recebeu nenhuma
        atualização. Desta maneira é possível saber se a condição virá precedida
        de uma vírgula ou não. */
        boolean naoPossuiAtualizacaoAinda = true;

        sql = "UPDATE ESPECIE\n"
                + "SET ";

        if (atualizaNomecientifico) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Nome_Cientifico = " + especieDTO.getNomeCientifico() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Nome_Cientifico = " + especieDTO.getNomeCientifico() + "\n";
            }
        }

        if (atualizaProcedencia) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Procedencia = " + especieDTO.getIdProcedencia() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Procedencia = " + especieDTO.getIdProcedencia() + "\n";
            }
        }

        if (atualizaNomevulgar) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Nome_Vulgar = " + especieDTO.getNomeVulgar() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Nome_Vulgar = " + especieDTO.getNomeVulgar() + "\n";
            }
        }

        if (atualizaFamilia) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Familia = " + especieDTO.getFamilia() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Familia = " + especieDTO.getFamilia() + "\n";
            }
        }

        if (atualizaGrpecogeral) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Grp_Eco_Geral = " + especieDTO.getIdGrpEcoGeral() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Grp_Eco_Geral = " + especieDTO.getIdGrpEcoGeral() + "\n";
            }
        }

        if (atualizaGrpecoespec) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Grp_Eco_Espec = " + especieDTO.getIdGrpEcoEspec() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Grp_Eco_Espec = " + especieDTO.getIdGrpEcoEspec() + "\n";
            }
        }

        if (atualizaDiammincopa) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Diam_Min_Copa = " + especieDTO.getDiamMinCopa() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Diam_Min_Copa = " + especieDTO.getDiamMinCopa() + "\n";
            }
        }

        if (atualizaDiammaxcopa) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Diam_Max_Copa = " + especieDTO.getDiamMaxCopa() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Diam_Max_Copa = " + especieDTO.getDiamMaxCopa() + "\n";
            }
        }

        if (atualizaFustemin) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Fuste_Min = " + especieDTO.getFusteMin() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Fuste_Min = " + especieDTO.getFusteMin() + "\n";
            }
        }

        if (atualizaFustemax) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Fuste_Max = " + especieDTO.getFusteMax() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Fuste_Max = " + especieDTO.getFusteMax() + "\n";
            }
        }

        if (atualizaAlturamin) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Altura_Min = " + especieDTO.getAlturaMin() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Altura_Min = " + especieDTO.getAlturaMin() + "\n";
            }
        }

        if (atualizaAlturamax) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Altura_Max = " + especieDTO.getAlturaMax() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Altura_Max = " + especieDTO.getAlturaMax() + "\n";
            }
        }

        if (atualizaDesenvolvimento) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Desenvolvimento = " + especieDTO.getIdDesenvolvimento() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Desenvolvimento = " + especieDTO.getIdDesenvolvimento() + "\n";
            }
        }

        if (atualizaCicloproducao) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Ciclo_Producao = " + especieDTO.getCicloProducao() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Ciclo_Producao = " + especieDTO.getCicloProducao() + "\n";
            }
        }

        if (atualizaFlcor) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "FL_Cor = " + especieDTO.getfLCor() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",FL_Cor = " + especieDTO.getfLCor() + "\n";
            }
        }

        if (atualizaTipofruto) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Tipo_Fruto = " + especieDTO.getIdTipoFruto() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Tipo_Fruto = " + especieDTO.getIdTipoFruto() + "\n";
            }
        }

        if (atualizaNatureza) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Natureza = " + especieDTO.getIdNatureza() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Natureza = " + especieDTO.getIdNatureza() + "\n";
            }
        }

        if (atualizaFrCor) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "FR_Cor = " + especieDTO.getfRCor() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",FR_Cor = " + especieDTO.getfRCor() + "\n";
            }
        }


        if (atualizaTiposemeadura) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Tipo_Semeadura = " + especieDTO.getIdTipoSemeadura() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Tipo_Semeadura = " + especieDTO.getIdTipoSemeadura() + "\n";
            }
        }

        if (atualizaSementeskg) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Sementes_KG = " + especieDTO.getSementesKG() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Sementes_KG = " + especieDTO.getSementesKG() + "\n";
            }
        }

        if (atualizaArmazenSemente) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Armazen_Semente = " + especieDTO.getIdArmazenSemente() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Armazen_Semente = " + especieDTO.getIdArmazenSemente() + "\n";
            }
        }

        if (atualizaTmpGerminMin) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Tmp_Germin_Min = " + especieDTO.getTmpGerminMin() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Tmp_Germin_Min = " + especieDTO.getTmpGerminMin() + "\n";
            }
        }

        if (atualizaTmpGerminMax) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Tmp_Germin_Max = " + especieDTO.getTmpGerminMax() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Tmp_Germin_Max = " + especieDTO.getTmpGerminMax() + "\n";
            }
        }

        if (atualizaPercentGermin) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Percent_Germin = " + especieDTO.getPercentGermin() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Percent_Germin = " + especieDTO.getPercentGermin() + "\n";
            }
        }

        if (atualizaViabilSemente) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Viabil_Semente = " + especieDTO.getViabilSemente() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Viabil_Semente = " + especieDTO.getViabilSemente() + "\n";
            }
        }

        sql += "WHERE Id = " + especieDTO.getId() + ";";

        connector.executeUpdateQuery(sql);
    }
}
